'use strict';
/** 使用的服务器id */
let serverIndex = 0;

module.exports.run = function(d,s){
    let bs = require("../module/base"), mapc = require("../config/map");
    switch(d[1]){
        case 1:{ //进入队列
            let mid = (d[2] && d[2].mapid) || 0;
            if(!mapc[mid]) return bs.sendE(s, 104);
            if("mapid" in s.U) return bs.sendE(s, 101);
            /**
             * LIST 缓存对应地图的等待队列
             * 每个用户是一个对象
             *  uid 对应用户的id
             *  t 最后进入队列的时间
             */
            global.LIST[mid] || (global.LIST[mid] = []);
            global.LIST[mid].push({uid:s.U.uid,t:Date.now()});
            s.U.mapid = mid;
            bs.send(s,d);
            if(global.LIST[mid].length >= mapc[mid].UserNum){ //队列满了可以分配地图了
                OnTime();
            }
            break;
        }default:{
            LOG.error("not msg", d);
        }
    }
}

function OnTime(){
    const server = require("../config/Server"), mapc = require("../config/map");
    let bs = require("../module/base");
    for(let mid=0;mid<mapc.length;mid++){
        global.LIST[mid] || (global.LIST[mid] = []);//console.log(mid, mapc);
        if(mapc[mid].UserNum > LIST[mid].length) continue;
        /** md 地图缓存数据 
         *      mapid 地图唯一id
         *      url 服务器地址
         *      end 1游戏结束
         *      u 用户缓存的数据 uid作为key
         *          rid 角色模型id
         *          t   用户类型 0找 1藏
         *          on  当前是否在线 在地图服务器上才有效
         *          PH  血量0时已经失败了 找的人有血量5 藏的人血量1
         *          x,y,z 当前坐标
         *          lx,ly,lz 上一次的坐标位置
         */
        let mkey = bs.MD5(Date.now().toString()), md = {mapid:mid,url:"",u:{},ru:{}}, ul = [], rdc = ["USER"];
        let f = mapc[mid].find, fx = mapc[mid].UserNum - f;
        for(let i=0;i<mapc[mid].UserNum;i++){ //分配用户
            let uid = LIST[mid][i].uid;
            ul.push(uid);
            md.u[uid] = {};
            if(Math.random()*100 < 50) md.u[uid].t = 0; //找
            else md.u[uid].t = 1; //藏
            if(md.u[uid].t == 0 && f == 0) md.u[uid].t = 1;
            else if(md.u[uid].t == 1 && fx == 0) md.u[uid].t = 0;
            if(md.u[uid].t == 1){ //随机藏的物品
                md.u[uid].rid = mapc[mid].roleList[(Math.random()*mapc[mid].roleList.length)|0];
                md.u[uid].PH = 1;
                fx--;
            }else{
                md.u[uid].rid = 0;
                md.u[uid].PH = 5;
                f--;
            }
            rdc.push(uid, mkey);
            USERMAP[uid] && USERMAP[uid].U && delete USERMAP[uid].U.mapid;
        }
        for(let i=0;i<mapc[mid].randRole.num;i++){ //分配随机生成的物品

        }
        serverIndex++;
        if(serverIndex >= server.length) serverIndex = 0;
        md.url = server[serverIndex];
        bs.RS(0).SETNX("MP"+mkey, JSON.stringify(md), (err, rep)=>{
            if(err) return;
            if(rep == 1){
                LIST[mid] = LIST[mid].slice(mapc[mid].UserNum);
                bs.sendUser(ul, `[1,99,{"url":"${md.url}","mkey":"${mkey}","mapid":${md.mapid}}]`);
                bs.RS(0).HMSET(rdc)
            }
        });
    }
}

let tv = setInterval(OnTime, 3000);
exports.destroy = function(){
    clearInterval(tv);
}
